package com.hu.common.pojo.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@ApiModel("响应结果对象")
@Data
public class Response<T> {

    @ApiModelProperty(value = "响应状态码", position = 0)
    private int code;

    @ApiModelProperty(value = "响应信息", position = 1)
    private String msg;

    @ApiModelProperty(value = "响应数据对象", position = 2)
    private T data;

    /**
     * 默认私有构造器
     */
    private Response() {
    }


    /**
     * 私有自定义构造器
     *
     * @param code 响应状态码
     * @param msg  响应消息
     * @param data 响应数据
     */
    private Response(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 返回一个 自定义响应消息和数据的 响应成功 的结果
     *
     * @param msg  响应消息
     * @param data 响应数据
     * @param <T>  响应数据的类型
     * @return 操作失败的响应结果对象
     */
    public static <T> Response success(String msg, T data) {
        return new Response<>(200, msg, data);
    }

    /**
     * 返回一个 自定义响应消息和数据的 响应失败 的结果
     *
     * @param msg  响应消息
     * @param data 响应数据
     * @param <T>  响应数据的类型
     * @return 操作失败的响应结果对象
     */
    public static <T> Response error(String msg, T data) {
        return new Response<>(500, msg, data);
    }

    /**
     * 返回一个自定义响应码和错误消息的 相应失败的结果
     *
     * @param code
     * @param msg
     * @param <T>
     * @return
     */
    public static <T> Response error(int code, String msg) {
        return new Response<>(code, msg, null);
    }

    /**
     * 返回一个 默认的 响应成功 的结果
     *
     * @return 操作成功的响应结果对象
     */
    public static Response success() {
        return success("操作成功");
    }

    /**
     * 私有自定义构造器
     *
     * @param code 响应状态码
     * @param msg  响应消息
     */
    public static <T> Response success(int code, String msg) {
        return new Response<>(code, msg, null);
    }


    /**
     * 返回一个 自定义响应消息的 响应成功 的结果
     *
     * @param msg
     * @return 操作成功的响应结果对象
     */
    public static Response success(String msg) {
        return success(msg, null);
    }

    /**
     * 返回一个 自定义响应数据的 响应成功 的结果
     *
     * @param data
     * @param <T>
     * @return 操作成功的响应结果对象
     */
    public static <T> Response success(T data) {
        return success("操作成功", data);
    }


    /**
     * 返回一个 默认的 响应失败 的结果
     *
     * @return 操作失败的响应结果对象
     */
    public static Response error() {
        return error("操作失败");
    }

    /**
     * 返回一个 自定义响应消息的 响应失败 的结果
     *
     * @param msg 响应消息
     * @return 操作失败的响应结果对象
     */
    public static Response error(String msg) {
        return error(msg, null);

    }

    /**
     * 返回一个 自定义响应数据的 响应失败 的结果
     *
     * @param data 响应数据
     * @param <T>  响应数据的类型
     * @return 操作失败的响应结果对象
     */
    public static <T> Response error(T data) {
        return error("操作失败", data);
    }


}